import { defineStore } from "pinia";
import { ref, computed } from "vue";
// 引入 API 层封装的请求（符合之前提到的分层原则）
import { getCartData, updateCartItem } from "@/api/cart";

// 定义购物车商品类型（TypeScript 可选）
// interface CartItem {
//   id: string
//   name: string
//   price: number
//   quantity: number
// }

export const useCartStore = defineStore("cart", () => {
  // 1. 响应式状态（用 ref/reactive 定义）
  // 购物车商品列表
  const items = ref([]);
  // 加载状态
  const isLoading = ref(false);
  // 错误信息
  const error = ref("");

  // 2. 计算属性（用 computed 定义）
  // 商品总数
  const totalCount = computed(() => {
    return items.value.reduce((sum, item) => sum + item.quantity, 0);
  });

  // 商品总价
  const totalPrice = computed(() => {
    return items.value.reduce(
      (sum, item) => sum + item.price * item.quantity,
      0
    );
  });

  // 是否为空购物车
  const isEmpty = computed(() => items.value.length === 0);

  // 3. 同步方法
  // 添加商品到购物车
  const addItem = (product, quantity = 1) => {
    // 检查商品是否已存在
    const existingItem = items.value.find((item) => item.id === product.id);

    if (existingItem) {
      // 已存在则增加数量
      existingItem.quantity += quantity;
    } else {
      // 不存在则添加新商品
      items.value.push({ ...product, quantity });
    }
  };

  // 从购物车移除商品
  const removeItem = (productId) => {
    items.value = items.value.filter((item) => item.id !== productId);
  };

  // 更新商品数量
  const updateQuantity = (productId, quantity) => {
    const item = items.value.find((item) => item.id === productId);
    if (item) {
      item.quantity = quantity;
      // 同步调用 API 更新后端（实际项目中可改为异步）
      syncCartToServer();
    }
  };

  // 清空购物车
  const clearCart = () => {
    items.value = [];
  };

  // 4. 异步方法（调用 API 并更新状态）
  // 从服务器加载购物车数据
  const fetchCart = async () => {
    isLoading.value = true;
    error.value = "";
    try {
      // 调用 API 层的请求
      const data = await getCartData();
      items.value = data.items;
    } catch (err) {
      error.value = err.message || "加载购物车失败";
      console.error("购物车加载错误:", err);
    } finally {
      isLoading.value = false;
    }
  };

  // 同步购物车到服务器（内部辅助方法）
  const syncCartToServer = async () => {
    try {
      await updateCartItem(items.value);
    } catch (err) {
      error.value = "同步购物车失败";
      console.error("同步失败:", err);
    }
  };

  // 5. 返回需要暴露给组件的状态和方法
  return {
    // 状态
    items,
    isLoading,
    error,
    // 计算属性
    totalCount,
    totalPrice,
    isEmpty,
    // 方法
    addItem,
    removeItem,
    updateQuantity,
    clearCart,
    fetchCart,
  };
});
